package euler.p051_100;

import java.io.IOException;

import euler.MainEuler;
import euler.helper.IncreasingPrimesHelper;

public class Euler058 extends MainEuler {

    /*
        Starting with 1 and spiralling anticlockwise in the following way,
        a square spiral with side length 7 is formed.

        37 36 35 34 33 32 31
        38 17 16 15 14 13 30
        39 18  5  4  3 12 29
        40 19  6  1  2 11 28
        41 20  7  8  9 10 27
        42 21 22 23 24 25 26
        43 44 45 46 47 48 49

        It is interesting to note that the odd squares lie along the
        bottom right diagonal, but what is more interesting is that 8 out
        of the 13 numbers lying along both diagonals are prime;
        that is, a ratio of 8/13 ≈ 62%.

        If one complete new layer is wrapped around the spiral above,
        a square spiral with side length 9 will be formed.
        If this process is continued, what is the side length of the
        square spiral for which the ratio of primes along
        both diagonals first falls below 10%?

     */
    public String resolve() throws IOException {
        int numeros = 13;
        int primos = 8;
        int i;
        int n = 49;
        IncreasingPrimesHelper primeHelper = null;
        try {
            primeHelper = new IncreasingPrimesHelper();

            for (i = 9; n > 0 && primos * 100 > numeros * 10; i+=2) {
                int j = i - 1;

                n+=j;
                if (primeHelper.isPrime(n)) {
                    primos++;
                }

                n+=j;
                if (primeHelper.isPrime(n)) {
                    primos++;
                }

                n+=j;
                if (primeHelper.isPrime(n)) {
                    primos++;
                }

                n+=j;
                numeros+=4;
            }
        } finally {
            if (primeHelper != null) {
                primeHelper.close();
            }
        }
        return String.valueOf(i-2);
        // 26241
    }

}
